/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package model.encomendaproduto;
import java.util.List;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceException;
import model.excecoes.ErroDAOException;
import model.excecoes.ErroNegocioException;
import model.interfaces.INegocioEncomendaProduto;
import model.factory.Factory;
import model.produto.Produto;
/**
 *
 * @author Marcos
 */
public class NegocioEncomendaProduto implements INegocioEncomendaProduto{

    private RepositorioEncomendaProduto repEncomenda = null;
    
    public NegocioEncomendaProduto(){
        repEncomenda = Factory.getEncomendaDAO();
    }
    
    private boolean verificarQuantidadeProduto(String descricao, String marca)throws ErroDAOException, PersistenceException, NoResultException{
        return repEncomenda.verificarQuantidadeProduto(descricao, marca);
    }
    
    @Override
    public void registrarEncomendaProduto(EncomendaProduto encomenda) throws ErroDAOException, ErroNegocioException, PersistenceException, NoResultException {
        if(encomenda.getPrazoDias() <= 0){
            throw new ErroNegocioException("Esse campo não pode ter valores negativos.");
        }
        
        if(encomenda.getQuantidadePedido() <= 0){
            throw new ErroNegocioException("Esse campo não pode ter valores negativos.");
        }
        
        
        
        for(Produto p: encomenda.getProdutos()){
            if(p.getCodigo() == 0){
               throw new ErroNegocioException("Código do Produto não encontrado.");
            }
            
            if(verificarQuantidadeProduto(p.getDescricao(), p.getMarca()) == false){
                throw new ErroNegocioException("Encomenda não registrada.\nSó poderá registrar a encomenda se a quantidade de produtos for menor do que 5.");
            }
        }
        
        int prazo = encomenda.getPrazoDias();
        int quantidade = encomenda.getQuantidadePedido();
        
        try{
            encomenda.setPrazoDias(prazo);
            encomenda.setQuantidadePedido(quantidade);
        }catch(NumberFormatException ex){
            throw new ErroNegocioException("Erro de formatação de números." + ex.getMessage());
        }
        
        repEncomenda.cadastrar(encomenda);
        
    }

    @Override
    public void alterarEncomendaProduto(EncomendaProduto encomenda) throws ErroDAOException, ErroNegocioException, PersistenceException, NoResultException {
        
        
        
        
        if(encomenda.getPrazoDias() <= 0){
            throw new ErroNegocioException("Esse campo não pode ter valores negativos.");
        }
        
        if(encomenda.getQuantidadePedido() <= 0){
            throw new ErroNegocioException("Esse campo não pode ter valores negativos.");
        }
        
        for(Produto p: encomenda.getProdutos()){
            if(p.getCodigo() == 0){
               throw new ErroNegocioException("Código do Produto não encontrado.");
            }
            
            if(verificarQuantidadeProduto(p.getDescricao(), p.getMarca()) == false){
                throw new ErroNegocioException("Encomenda não registrada.\nSó poderá registrar a encomenda se a quantidade de produtos for menor do que 5.");
            }
        }
        
        int prazo = encomenda.getPrazoDias();
        int quantidade = encomenda.getQuantidadePedido();
        
        try{
            encomenda.setPrazoDias(prazo);
            encomenda.setQuantidadePedido(quantidade);
        }catch(NumberFormatException ex){
            throw new ErroNegocioException("Erro de formatação de números." + ex.getMessage());
        }
        
        repEncomenda.alterar(encomenda);
    }

    @Override
    public void excluirEncomendaProduto(EncomendaProduto encomenda) throws ErroDAOException, ErroNegocioException, PersistenceException, NoResultException {
        
        
        repEncomenda.excluir(encomenda);
    }

    @Override
    public List<EncomendaProduto> listarEncomenda(String consulta, String campo) throws ErroDAOException, ErroNegocioException, PersistenceException, NoResultException {
        List<EncomendaProduto> encomendas = repEncomenda.listarEncomenda(consulta, campo);
        
        
        if(!consulta.equals("Todos") && !campo.equals("Todos")){
            if(encomendas.isEmpty()){
                throw new ErroNegocioException("Encomenda não encontrada ou não cadastrada.\nPor favor informe os dados corretos ou cancele a operação.");
            }
        }
        return encomendas;
    }

    @Override
    public int identificarCodigoProduto(String descricao, String marca) throws ErroDAOException, ErroNegocioException, PersistenceException, NoResultException {
        int codigo = repEncomenda.identificarCodigoProduto(descricao, marca);
        
        
        
        return codigo;
    }
    
}
